package ui.swing.dnd;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.BufferedReader;
import java.io.Reader;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.TransferHandler;

public class UberHandler extends TransferHandler {
	
	JTextArea output;

	public boolean canImport(JComponent dest, DataFlavor[] flavors) {
		// You bet we can!
		return true;
	}

	public boolean importData(JComponent src, Transferable transferable) {
		// Here's the tricky part.
		println("Receiving data from " + src);
		println("Transferable object is: " + transferable);
		println("Valid data flavors: ");
		DataFlavor[] flavors = transferable.getTransferDataFlavors();
		DataFlavor listFlavor = null;
		DataFlavor objectFlavor = null;
		DataFlavor readerFlavor = null;
		// Check the flavors and see if we find one we like. If we do, save it.
		for (int f = 0; f < flavors.length; f++) {
			println(" " + flavors[f]);
			if (flavors[f].isFlavorJavaFileListType()) {
				listFlavor = flavors[f];
			}
			if (flavors[f].isFlavorSerializedObjectType()) {
				objectFlavor = flavors[f];
			}
			if (flavors[f].isRepresentationClassReader()) {
				readerFlavor = flavors[f];
			}
		}

		// Now try to display the content of the drop.
		try {
			DataFlavor bestTextFlavor = DataFlavor.selectBestTextFlavor(flavors);
			BufferedReader br = null;
			String line = null;
			if (bestTextFlavor != null) {
				println("Best text flavor: " + bestTextFlavor.getMimeType());
				println("Content:");
				Reader r = bestTextFlavor.getReaderForText(transferable);
				br = new BufferedReader(r);
				line = br.readLine();
				while (line != null) {
					println(line);
					line = br.readLine();
				}
				br.close();
			} else if (listFlavor != null) {
				java.util.List list = (java.util.List) transferable.getTransferData(listFlavor);
				println(list);
			} else if (objectFlavor != null) {
				println("Data is a java object:\n" + transferable.getTransferData(objectFlavor));
			} else if (readerFlavor != null) {
				println("Data is an InputStream:");
				br = new BufferedReader((Reader) transferable.getTransferData(readerFlavor));
				line = br.readLine();
				while (line != null) {
					println(line);
				}
				br.close();
			} else {
				// Don't know this flavor type yet
				println("No text representation to show.");
			}
			println("\n\n");
		} catch (Exception e) {
			println("Caught exception decoding transfer:");
			println(e);
			return false;
		}
		return true;

	}

	public void exportDone(JComponent src, Transferable data, int action) {
		// Just let us know when it occurs.
		System.err.println("Export Done.");
	}

	public void setOutput(JTextArea jta) {
		output = jta;
	}

	protected void print(Object o) {
		print(o.toString());
	}

	protected void print(String s) {
		if (output != null) {
			output.append(s);
		} else {
			System.out.println(s);
		}
	}

	protected void println(String s) {
		if (output != null) {
			output.append(s);
			output.append("\n");
		} else {
			System.out.println(s);
		}
	}

	protected void println() {
		println("");
	}

	protected void println(Object o) {
		println(o.toString());
	}

	public static void main(String args[]) {
		JFrame frame = new JFrame("Debugging Drop Zone");
		frame.setSize(500, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JTextArea jta = new JTextArea();
		UberHandler uh = new UberHandler();
		uh.setOutput(jta);
		jta.setTransferHandler(uh);
		jta.setDragEnabled(true);

		frame.getContentPane().add(new JScrollPane(jta));
		frame.setVisible(true);
	}
}
